'use strict';

const jwt = require('jsonwebtoken');

/**
 * TOKEN 校验中间件
 * @author padipata
 *
 * @param next
 *
 * @modified by padipata on 15:01 2018/7/19
 * @return {Promise<void>}
 */

'use strict';

module.exports = () => {
  return async function(ctx, next) {
    const token = ctx.header.authorization;
    if (!token) return ctx.throw(401, 'token不能为空');

    // 验证token是否过期
    try {
      const userInfo = jwt.verify(token.split('Bearer ')[1], ctx.app.config.jwt.secret);
      const exp = userInfo.exp; // 过期时间
      const now = parseInt(new Date().getTime() / 1000);
      // 有效期小于一小时的重新赋值token
      const isOver = exp - now < 60 * 60;
      ctx.state.user = userInfo;
      if (isOver) {
        const newToken = jwt.sign({ id: userInfo.id }, ctx.app.config.jwt.secret, { expiresIn: '7d' });
        ctx.set('authorization', 'Bearer ' + newToken);
      }
    } catch (err) {
      // token过期
      if (err.name === 'TokenExpiredError') return ctx.throw(401, 'token过期');
      if (err.name === 'JsonWebTokenError') return ctx.throw(401, 'token无效');
      return ctx.throw(401);
    }
    await next();
  };
};